package com.hll.javaweb.servlet.file;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

/**
 * @author hll
 * @create 2022-05-10 13:10
 */
@WebServlet("/upload-file")
public class Upload extends HttpServlet {
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    req.setCharacterEncoding("UTF-8");
    // 1、创建fileItem工厂
    DiskFileItemFactory factory = new DiskFileItemFactory();
    // 2、创建文件上传对象
    ServletFileUpload fileUpload = new ServletFileUpload(factory);
    // 设置当文件的大小为 50KB
    // fileUpload.setFileSizeMax(1024*50);
    // 设置多个文件的总大小为 150KB
    // fileUpload.setSizeMax(1024 * 150);
    /*
     catch (SizeLimitExceededException e) {
         response.setContentType("text/html;charset=UTF-8");
         response.getWriter().write("文件大小超出限制");
    }
     */

    // 3、解析文件上传请求
    try {
      List<FileItem> list = fileUpload.parseRequest(req);
      // 4、遍历解析出的每个FileItem文件
      for (FileItem f : list) {
        // 这是普通表单项
        if (f.isFormField()) {
          // 表单项的name值
          String fieldName = f.getFieldName();
          // 表单项value，使用编码取得中文
          String fieldValue = f.getString("utf-8");
          System.out.println(fieldName + ":" + fieldValue);
          // 表示文件表单项
        } else {
          // 获取文件大小，有可能并没有上传文件
          long size = f.getSize();
          if (size == 0) {
            continue;
          }
          // 获取文件名字
          String name = f.getName();
          // ie下是全路径，火狐谷歌为文件名，需要不同处理
          if (name.contains("\\")) {
            name = name.substring(name.lastIndexOf("\\") + 1);
          }
          // 获取文件保存的服务端路径,如果你是maven IDEA exploded部署运行的话
          // target/JavaWeb-1.0-SNAPSHOT/upload 即真实路径，有相应图片
          // 打war包后，tomcat项目目录下有upload
          // IDEA 部署的两种方式区别 ： https://blog.csdn.net/u013041642/article/details/79475095
          String realPath = req.getServletContext().getRealPath("/upload"); // 你也可以写入固定磁盘中
          File file = new File(realPath);
          if (!file.exists()) {
            file.mkdirs();
          }
          // 生成一个唯一不重复的文件名
          name = UUID.randomUUID().toString().replace("-", "") + "-" + name;
          // 将文件内容写入
          f.write(new File(realPath + "/" + name));
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    resp.setContentType("text/html;charset=UTF-8");
    resp.getWriter().write("上传完成！");
  }
}
